package com.agritech.proxy;

import com.agritech.machine.AgriculturalMachineContext;
import com.agritech.command.Command;
import com.agritech.command.StartMachineCommand;
import com.agritech.command.StopMachineCommand;
import com.agritech.command.WorkMachineCommand;
import com.agritech.command.RemoteControl; // 假设代理也使用遥控器来发送命令

public class AgriculturalMachineProxy implements MachineProxy {
    private AgriculturalMachineContext realMachine; // 对真实对象的引用
    private String machineId;
    private RemoteControl remoteControl; // 每个代理实例可以有自己的遥控器或共享一个

    public AgriculturalMachineProxy(String machineId, String type) {
        this.machineId = machineId;
        // 实际中，真实对象的创建可能延迟到第一次使用时（懒加载）
        // 或者由工厂创建并传入
        this.realMachine = new AgriculturalMachineContext(machineId, type);
        this.remoteControl = new RemoteControl();
        System.out.println("农机代理已创建，代理农机ID: " + machineId + " 类型: " + type);
    }

    private boolean checkAccess(String userId, String operation) {
        // 模拟权限检查
        System.out.println("代理: 用户 [" + userId + "] 尝试执行操作 [" + operation + "] 在农机 [" + machineId + "] 上。");
        if ("admin".equalsIgnoreCase(userId) || ("operator1".equalsIgnoreCase(userId) && !"stop".equalsIgnoreCase(operation))) {
            System.out.println("代理: 用户 [" + userId + "] 权限验证通过。");
            return true;
        }
        System.out.println("代理: 用户 [" + userId + "] 权限不足，操作 [" + operation + "] 被拒绝!");
        return false;
    }

    @Override
    public void startOperation(String userId) {
        if (checkAccess(userId, "start")) {
            System.out.println("代理: 准备通过命令启动农机 [" + machineId + "]");
            Command startCommand = new StartMachineCommand(realMachine);
            remoteControl.setCommand(startCommand);
            remoteControl.pressButton();
        }
    }

    @Override
    public void stopOperation(String userId) {
        if (checkAccess(userId, "stop")) {
            System.out.println("代理: 准备通过命令停止农机 [" + machineId + "]");
            Command stopCommand = new StopMachineCommand(realMachine);
            remoteControl.setCommand(stopCommand);
            remoteControl.pressButton();
        }
    }

    @Override
    public void workOperation(String userId) {
        if (checkAccess(userId, "work")) {
            System.out.println("代理: 准备通过命令让农机 [" + machineId + "] 开始作业");
            Command workCommand = new WorkMachineCommand(realMachine);
            remoteControl.setCommand(workCommand);
            remoteControl.pressButton();
        }
    }

    @Override
    public void displayStatus(String userId) {
        // 查看状态通常权限要求较低
        if (checkAccess(userId, "displayStatus")) {
            System.out.println("代理: 用户 [" + userId + "] 请求查看农机 [" + machineId + "] 状态。");
            realMachine.displayStatus();
        }
    }

    @Override
    public String getMachineId() {
        return this.machineId;
    }
    
    // 代理可以暴露真实对象，但这通常不推荐，除非特定场景需要
    // public AgriculturalMachineContext getRealMachine() {
    //     return realMachine;
    // }
}